﻿#pragma once

#include "defines.h"
#include "memory/nedmalloc.h"
#include "libzqutil/utime.h"

namespace libzq
{
#pragma pack(push,1)

	struct MsgHeader
	{
	public:
		enum
		{
			MsgHeaderLength = 46,
		};

		MsgHeader();
		explicit MsgHeader(uint32_t flag);
		explicit MsgHeader(const char* msgid);

		string msgid() const;
		bool is_expire();
		void expire(uint16_t t);
	public:
		uint16_t _msg_ver; // 消息版本
		uint32_t _total_len; // 消息体长度
		uint16_t _api_ver; // 接口版本
		uint32_t _flag; // 其他标记(按位)
		char	  _msgid[32]; //消息包id
		uint16_t  _header_len; // 消息头实际长度,用于扩展消息头
		// 以上字段为一个数据包的基本构成

		// 以下为扩展字段,并非每个数据包都有
		uint64_t _call_stamp; // 请求发生时间戳
		uint64_t _expire_stamp; // 请求超时时间戳， 处理端获取到请求后，判断请求是否超时， 超时则不处理
	};
	struct MsgPacker : public MsgHeader
	{
		const char*	_msg;

		MsgPacker();
		explicit MsgPacker(const string& msg);
		MsgPacker(const string& msg, uint32_t flag);
		MsgPacker(const string& msg, const char* msgid);

		uint32_t msg_size() const;
		string msg_body() const;
		string pack_msg() const;
		static void	destory(MsgPacker* msg);
		static std::shared_ptr<MsgPacker> create(const char* data, size_t len);
	private:
		explicit MsgPacker(const char* msg);
	};
#pragma pack(pop)
}